package LinkList;

import org.w3c.dom.Node;

public class _31反转链表 {
    public static void main(String[] args) {

    }

    class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    //反转链表的定义
    //一种解决方案是按原始顺序迭代结点，并将它们逐个移动到列表的头部。似乎很难理解。我们先用一个例子来说明我们的算法。
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dummy = new ListNode(0,head);
        ListNode cur = head;
        while (cur != null && cur.next != null) {
            ListNode next = cur.next;
            cur.next = cur.next.next;
            next.next = dummy.next;
            dummy.next = next;

        }

        return dummy.next;

    }

    //官解迭代
    /*
        public ListNode reverseList(ListNode head) {
            ListNode prev = null;
            ListNode curr = head;
            while (curr != null) {
                ListNode next = curr.next;
                curr.next = prev;
                prev = curr;
                curr = next;
            }
            return prev;
        }

     */

    //官解递归(大佬注解版)
//    /**
//     * 以链表1->2->3->4->5举例
//     * @param head
//     * @return
//     */
//    public ListNode reverseList(ListNode head) {
//        if (head == null || head.next == null) {
//            /*
//                直到当前节点的下一个节点为空时返回当前节点
//                由于5没有下一个节点了，所以此处返回节点5
//             */
//            return head;
//        }
//        //递归传入下一个节点，目的是为了到达最后一个节点
//        ListNode newHead = reverseList(head.next);
//                /*
//            第一轮出栈，head为5，head.next为空，返回5
//            第二轮出栈，head为4，head.next为5，执行head.next.next=head也就是5.next=4，
//                      把当前节点的子节点的子节点指向当前节点
//                      此时链表为1->2->3->4<->5，由于4与5互相指向，所以此处要断开4.next=null
//                      此时链表为1->2->3->4<-5
//                      返回节点5
//            第三轮出栈，head为3，head.next为4，执行head.next.next=head也就是4.next=3，
//                      此时链表为1->2->3<->4<-5，由于3与4互相指向，所以此处要断开3.next=null
//                      此时链表为1->2->3<-4<-5
//                      返回节点5
//            第四轮出栈，head为2，head.next为3，执行head.next.next=head也就是3.next=2，
//                      此时链表为1->2<->3<-4<-5，由于2与3互相指向，所以此处要断开2.next=null
//                      此时链表为1->2<-3<-4<-5
//                      返回节点5
//            第五轮出栈，head为1，head.next为2，执行head.next.next=head也就是2.next=1，
//                      此时链表为1<->2<-3<-4<-5，由于1与2互相指向，所以此处要断开1.next=null
//                      此时链表为1<-2<-3<-4<-5
//                      返回节点5
//            出栈完成，最终头节点5->4->3->2->1
//         */
//        head.next.next = head;
//        head.next = null;
//        return newHead;
//    }
}
